題目:
在這篇文章中,我們將探討 LeetCode 383:Ransom Note,並解釋如何有效地解決這個問題。題目要求我們判斷,給定的 ransomNote
是否可以用 magazine
中的字母構成。每個字母只能使用一次,因此我們需要確保 magazine
中的字母數量足夠。
題目給了我們兩個字串 ransomNote
和 magazine
,並要求判斷 ransomNote
中的每個字母在 magazine
中是否有相同或更多的出現次數。也就是說,magazine
中必須包含 ransomNote
的所有字母,並且每個字母的出現次數不得少於 ransomNote
。
範例:
ransomNote = "a"
,magazine = "b"
→ 回傳 false
,因為 magazine
中沒有字母 "a"。ransomNote = "aa"
,magazine = "ab"
→ 回傳 false
,因為 magazine
中只有一個 "a"。ransomNote = "aa"
,magazine = "aab"
→ 回傳 true
,因為 magazine
中有足夠的 "a" 來構成 ransomNote
。用一個 hash table 裝進 magazine 每個字母出現的次數,然後遍歷 ransomNote 對每個字母去檢查 hash table 有沒有存在,有的話次數就減 1,否則就直接回傳 false,遍歷完表示符合條件回傳 true。
實作:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> map;
for (auto c : magazine) {
map[c]++;
}
for (auto c : ransomNote) {
if (map.count(c) > 0 && map[c] > 0) {
//if (map.find(c) != map.end() && map[c] > 0) {
map[c]--;
} else {
return false;
}
}
return true;
}
};
不用 hash table 用陣列實做,
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> count(26, 0);
for (auto c : magazine) {
count[c - 'a']++;
}
for (auto c : ransomNote) {
if (count[c - 'a'] > 0) {
count[c - 'a']--;
} else {
return false;
}
}
return true;
}
};